struct BuildData { x int }
struct Tensor { x int }
fn new_tensor<T>(data BuildData) Tensor {
	println('data: $data')
	x := T(data.x)
    println(x)
	return Tensor{ data.x }
}
fn test_generic_function_returning_type_starting_with_t() {
	ft := new_tensor<f64>(x:123)
	println(ft)
    assert typeof(ft) == 'Tensor'
    assert '$ft' == 'Tensor{\n    x: 123\n}'
    //
	it := new_tensor<int>(x:456)
	println(it)
    assert typeof(it) == 'Tensor'
    assert '$it' == 'Tensor{\n    x: 456\n}'
}

// the following verifies that returning a generic type T
// works at the same time as returning a type starting with T
fn new_t<T>(o T) T {
	x := T(o)
    return x
}
fn test_generic_function_returning_t_type() {
	f := new_t<f64>(1.23)
    i := new_t<int>(456)
    assert '$f' == '1.23'
    assert '$i' == '456'
}
